﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace GestionRecaudos
{
    public partial class FrmAdministrarMenuRol : Form
    {
        private DataTable OpcionesRol=null;
        private Boolean activarCascada = false;
        private Boolean DESHABILITARCascada = false;


        public FrmAdministrarMenuRol()
        {
            InitializeComponent();
        }

        private void FrmAdministrarMenuRol_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'GestionRecaudosDataSet.spSeguridadRol' Puede moverla o quitarla según sea necesario.
            this.spSeguridadRolTableAdapter.Fill(this.GestionRecaudosDataSet.spSeguridadRol);

            //--- Cargar la informacion en el TreeView
            this.cargarInformacionEnAWTreeView();
        }

        private void codRolBuscadorAWIL_Leave(object sender, EventArgs e)
        {
            if (this.codRolBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty))
            {
                this.guardarButton.Enabled = false;
                return;
            }
            try
            {
                //--- Cargo las opciones del menu asociadas al rol seleccionado.
                this.spSeguridadRolMenuTableAdapter.FillBy(
                    this.GestionRecaudosDataSet.spSeguridadRolMenu,
                    "SelectMenuRol",
                    null,
                    null,
                    null,
                    null,
                    null,
                    this.codRolBuscadorAWIL.AWIL_Texto.Trim()
                    );

                //--- Deschequeo todas los nodos del arbol
                this.DESHABILITARCascada = false;
                this.menuRolTreeView.Nodes[0].Checked = true;
                this.menuRolTreeView.Nodes[0].Checked = false;

                //--- chequeo las opciones que tenga asignado el rol indicado
                this.DESHABILITARCascada = true;
                foreach (GestionRecaudosDataSet.spSeguridadRolMenuRow row in this.GestionRecaudosDataSet.spSeguridadRolMenu.Rows)
                {
                    this.CheckNodo(row.CodMenu, true);
                }
                this.DESHABILITARCascada = false;
                
                //--- habilito el boton para guardar los cambios
                this.guardarButton.Enabled = true;

                //-- Expando el arbol
                this.menuRolTreeView.ExpandAll();
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
        }

        private void guardarButton_Click(object sender, EventArgs e)
        {
            if (this.codRolBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty))
            {
                this.guardarButton.Enabled = false;
                return;
            }
            try
            {
                //--- Reinicio el datagridview
                this.OpcionesRol = new DataTable();
                this.OpcionesRol.Columns.Add("CodMenu");
                
                //--- Cargo las opciones "CHECKEADAS" en el datagridview, para luego pasarlas a un XML y poderlas enviar al procedimeitno correspondiente
                foreach (TreeNode n in this.menuRolTreeView.Nodes[0].Nodes)
                {
                    this.agregarNodeAlDataTable(n);
                }

                //--- Grabo en la base de datos
                this.spSeguridadRolMenuTableAdapter.FillBy(
                    this.GestionRecaudosDataSet.spSeguridadRolMenu,
                    "ActualizarMenuRol",
                    Utils.get().dataTableToXML(this.OpcionesRol),
                    null,
                    null,
                    null,
                    null,
                    this.codRolBuscadorAWIL.AWIL_Texto.Trim()
                    );

                //--- Reincio la pantalla
                this.menuRolTreeView.Nodes[0].Checked = true;
                this.menuRolTreeView.Nodes[0].Checked = false;
                this.codRolBuscadorAWIL.AWIL_Texto = string.Empty;
                this.menuRolTreeView.ExpandAll();
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
        }
        
        //--- Funcion recursiva, para pasr todas las opcines chequedas al datagridview
        private void agregarNodeAlDataTable(TreeNode node)
        {
            if (node.Checked)
            {
                this.OpcionesRol.Rows.Add(node.Name);
            }
            foreach (TreeNode n in node.Nodes)
            {
                this.agregarNodeAlDataTable(n);
            }
        }

        private void menuRolTreeView_AfterCheck(object sender, TreeViewEventArgs e)
        {
            //--- esto solo aplica al nodo PRINCIPAL del arbol
            if (!this.activarCascada && e.Node.Nodes.Count.Equals(0))
            {
                return;
            }

            this.activarCascada = false;
            foreach (TreeNode n in e.Node.Nodes)
            {
                this.CheckNodoEnCascada(n, e.Node.Checked);
            }
            this.activarCascada = true;
        }
        //--- Chequear en cascada
        private void CheckNodoEnCascada(TreeNode node, Boolean check)
        {
            if (DESHABILITARCascada)
            {
                return;
            }

            node.Checked = check;
            foreach (TreeNode n in node.Nodes)
            {
                this.CheckNodoEnCascada(n, check);
            }
            
        }
        
        private void cargarInformacionEnAWTreeView()
        {
            //--- Limpio el control y cargo un unico nodo que permitira agregar mas nodos al control
            try
            {
                //--- limpio los campos de la ventana
                this.codRolBuscadorAWIL.AWIL_Texto = string.Empty;
                
                this.menuRolTreeView.Nodes.Clear();
                TreeNode temp = new TreeNode();
                temp.Name = "";
                temp.Text = "MENU DE LA APLICACION";
                temp.Tag = "";
                this.menuRolTreeView.Nodes.Add(temp);
                //--- Cargar todos los nodos desde la BD de forma recursiva
                this.cargarInformacionEnAWTreeView(temp, null);
                //--- expando el arbol
                this.menuRolTreeView.ExpandAll();
            }
            catch (Exception e)
            {
                MessageException.show(e);
            }
        }
        private void cargarInformacionEnAWTreeView(Object awTreeView, string CodigoSuperior)
        {
            try
            {
                GestionRecaudosDataSet.spSeguridadMenuDataTable table = new GestionRecaudosDataSet.spSeguridadMenuDataTable();

                this.spSeguridadMenuTableAdapter.FillBy(
                    table,
                    "SelectHijos",
                    null,
                    null,
                    null,
                    null,
                    CodigoSuperior,
                    null,
                    null,
                    null,
                    null,
                    null,
                    null
                );
                //--- Obtengo la informacion del control desde la BD

                if (table.Count == 0)
                {
                    return;
                }
                foreach (DataRow R in table.Rows)
                {
                    TreeNode temp = new TreeNode();
                    temp.Name = R["Codigo"].ToString();
                    temp.Text = R["Etiqueta"].ToString().Replace("&","");
                    temp.Tag = R["Codigo"].ToString();
                    
                    ((TreeNode)awTreeView).Nodes.Add(temp);
                    this.cargarInformacionEnAWTreeView(temp, R["Codigo"].ToString());
                }
            }
            catch (Exception e)
            {
                MessageException.show(e);
            }
        }

        //--- Funcion para Chequear un nodo en una coleccion.
        private void CheckNodo(String NombreNodo, Boolean check)
        {
            if (!this.menuRolTreeView.CheckBoxes)
            {
                return;
            }

            this.CheckNodo(this.menuRolTreeView.Nodes, NombreNodo, check);
        }
        //--- metodo Recursivo
        private void CheckNodo(TreeNodeCollection Nodes, String NombreNodo, Boolean check)
        {
            foreach (TreeNode n in Nodes)
            {
                if (n.Name == NombreNodo)
                {
                    n.Checked = check;
                    return;
                }
                else if (n.Nodes.Count > 0)
                {
                    this.CheckNodo(n.Nodes, NombreNodo, check);
                }
            }
        }
    }
}
